package com.thx.addressbook.service;

import com.thx.addressbook.dao.AddressbookCategoryDao;
import com.thx.addressbook.model.AddressbookCategory;
import com.thx.addressbook.model.AddressbookGroup;
import com.thx.addressbook.model.AddressbookRole;
import com.thx.addressbook.view.CategoryGroupView;
import com.thx.common.service.BaseManager;
import com.thx.common.util.AppContext;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;



@Service
@Transactional(readOnly = true)
public class AddressbookCategoryService extends BaseManager<AddressbookCategory> {

  private static final Logger logger = LoggerFactory.getLogger(AddressbookCategoryService.class);

  @Autowired
  private AddressbookCategoryDao addressbookCategoryDao;

  @Autowired
  private AddressbookGroupService addressbookGroupService;

  @Autowired
  private AddressbookRoleService addressbookRoleService;

  /**
   * 修改时查询通信录分类信息.
   * 
   * @param info 分类对象
   * @return 分类对象
   */
  public AddressbookCategory queryCategoryOne(AddressbookCategory info) {
    Long acId = info.getAcId();
    Long enterpriseId = info.getEnterpriseId();
    return addressbookCategoryDao.findByIdAndEnterpriseId(acId, enterpriseId);
  }

  /**
   * 根据Id查找 分类.
   * 
   * @param acId 分类id
   * @return 分类对象
   */
  public AddressbookCategory findById(Long acId) {
    return addressbookCategoryDao.findById(acId);
  }

  /**
   * 根通信录名称验证通信录是否存在.
   * 
   * @param entity 分类对象
   * @return 分类对象
   */
  public int getCategoryName(AddressbookCategory entity) {
    AddressbookCategory category = addressbookCategoryDao.findByAcName(entity.getAcName());
    return category != null ? 1 : 0;
  }

  /**
   * 删除分类.
   * 
   * @param acId 分类id主键
   */
  @Transactional(readOnly = false)
  public void deleteCategoryById(Long acId) {
    addressbookCategoryDao.deleteCategoryById(acId);
  }

  /**
   * 根据分类名称、人员id、人员所属部门id、人员角色、是否管理员、所属租户id查询分类列表对象.
   * 
   * @param acName 分类名称, 可以为空
   * @param personnelId 人员id,不能为空
   * @param depId 人员所属部门id,不能为空
   * @param role 人员角色id,不能为空
   * @param ifAdmin 是否管理员,不能为空
   * @param enterpriseId 所属租户id,不能为空
   * @return 全部分类列表
   */
  public List<AddressbookCategory> findAllByAcNameAndPersonnelProperties(String acName,
      Long personnelId, Long depId, Long role, boolean ifAdmin, Long enterpriseId) {
    String clientAddCategoryId = AppContext.getProperties("clientAddCategoryId");
    String perAddCategoryId = AppContext.getProperties("perAddCategoryId");
    List authorizeIds = new ArrayList();
    List publicacIds = new ArrayList();
    if (ifAdmin) {
      if (StringUtils.isNoneBlank(perAddCategoryId)) {
        publicacIds.add(NumberUtils.toLong(perAddCategoryId));
      }
      if (StringUtils.isNoneBlank(clientAddCategoryId)) {
        publicacIds.add(NumberUtils.toLong(clientAddCategoryId));
      }

    } else {
      List<AddressbookRole> canReadCategrys = addressbookRoleService.findCategryByPerIdOrDepOrRole(
          String.valueOf(personnelId), String.valueOf(depId), String.valueOf(role));
      if (canReadCategrys != null && canReadCategrys.size() != 0) {
        for (AddressbookRole abr : canReadCategrys) {
          authorizeIds.add(String.valueOf(abr.getParentId()));
        }
      }
      if (StringUtils.isNoneBlank(perAddCategoryId)) {
        publicacIds.add(perAddCategoryId);
      }
    }
    return addressbookCategoryDao.findAllByAcIdAndAcNameAndEnterpriseId(authorizeIds, publicacIds,
        acName, enterpriseId);
  }

  /**
   * 根据分类名称、人员id、人员所属部门id、人员角色、是否管理员、所属租户id查询分类列表对象数量.
   * 
   * @param acName 分类名称, 可以为空
   * @param personnelId 人员id,不能为空
   * @param depId 人员所属部门id,不能为空
   * @param role 人员角色id,不能为空
   * @param ifAdmin 是否管理员,不能为空
   * @param enterpriseId 所属租户id,不能为空
   * @return 分类列表总数
   */
  public int findAllAcountByAcNameAndPersonnelProperties(String acName, Long personnelId,
      Long depId, Long role, boolean ifAdmin, Long enterpriseId) {
    String clientAddCategoryId = AppContext.getProperties("clientAddCategoryId");
    String perAddCategoryId = AppContext.getProperties("perAddCategoryId");
    List<Long> authorizeIds = new ArrayList();
    List<Long> publicacIds = new ArrayList();
    if (ifAdmin) {
      publicacIds.add(NumberUtils.toLong(clientAddCategoryId));
      publicacIds.add(NumberUtils.toLong(perAddCategoryId));
    } else {
      List<AddressbookRole> canReadCategrys = addressbookRoleService.findCategryByPerIdOrDepOrRole(
          String.valueOf(personnelId), String.valueOf(depId), String.valueOf(role));
      if (canReadCategrys != null && canReadCategrys.size() != 0) {
        for (AddressbookRole abr : canReadCategrys) {
          authorizeIds.add(abr.getParentId());
        }
      }
      publicacIds.add(NumberUtils.toLong(perAddCategoryId));
    }
    return addressbookCategoryDao.findAllCountByAcIdAndAcNameAndEnterpriseId(authorizeIds,
        publicacIds, acName, enterpriseId);
  }

  /**
   * 根据分类名称、人员id、人员所属部门id、人员角色、是否管理员、所属租户id分页查询分类列表对象.
   * 
   * @param acName 分类名称, 可以为空
   * @param personnelId 人员id,不能为空
   * @param depId 人员所属部门id,不能为空
   * @param role 人员角色id,不能为空
   * @param ifAdmin 是否管理员,不能为空
   * @param enterpriseId 所属租户id,不能为空
   * @return 分页分类列表
   */
  public List<AddressbookCategory> findByAcNameAndPersonnelProperties(String acName,
      Long personnelId, Long depId, Long role, boolean ifAdmin, Long enterpriseId) {
    String clientAddCategoryId = AppContext.getProperties("clientAddCategoryId");
    String perAddCategoryId = AppContext.getProperties("perAddCategoryId");
    List<Long> authorizeIds = new ArrayList();
    List<Long> publicacIds = new ArrayList();
    if (ifAdmin) {
      publicacIds.add(NumberUtils.toLong(clientAddCategoryId));
      publicacIds.add(NumberUtils.toLong(perAddCategoryId));
    } else {
      List<AddressbookRole> canReadCategrys = addressbookRoleService.findCategryByPerIdOrDepOrRole(
          String.valueOf(personnelId), String.valueOf(depId), String.valueOf(role));
      if (canReadCategrys != null && canReadCategrys.size() != 0) {
        for (AddressbookRole abr : canReadCategrys) {
          authorizeIds.add(abr.getParentId());
        }
      }
      publicacIds.add(NumberUtils.toLong(perAddCategoryId));
    }
    return addressbookCategoryDao.findByAcIdAndAcNameAndEnterpriseId(authorizeIds, publicacIds,
        acName, enterpriseId);
  }

  /**
   * 根据企业租户id、是否公共查询企业所有分类.
   * 
   * @param enterpriseId 所属企业租户id,不能为空
   * @return 全部分类列表
   */
  public List<AddressbookCategory> findAllEnterpriseCategory(Long enterpriseId) {
    String enterpriseDefault = AppContext.getProperties("clientAddCategoryId");
    List<Long> authorizeIds = new ArrayList();
    List<Long> publicacIds = new ArrayList();
    publicacIds.add(NumberUtils.toLong(enterpriseDefault));
    return addressbookCategoryDao.findAllByAcIdAndAcNameAndEnterpriseId(authorizeIds, publicacIds,
        "", enterpriseId);
  }

  /**
   * 根据企业租户id、是否公共查询企业所有分类数量.
   * 
   * @param enterpriseId 所属企业租户id,不能为空
   * @return 全部分类列表数量
   */
  public int findAllCountEnterpriseCategory(Long enterpriseId) {
    String enterpriseDefault = AppContext.getProperties("clientAddCategoryId");
    List<Long> authorizeIds = new ArrayList();
    List<Long> publicacIds = new ArrayList();
    publicacIds.add(NumberUtils.toLong(enterpriseDefault));
    // 插入企业所有子定义分类
    return addressbookCategoryDao.findAllCountByAcIdAndAcNameAndEnterpriseId(authorizeIds,
        publicacIds, "", enterpriseId);
  }

  /**
   * 根据企业租户id、是否公共查询企业分页分类.
   * 
   * @param enterpriseId 所属企业租户id,不能为空
   * @return 分页分类列表
   */
  public List<AddressbookCategory> findEnterpriseCategory(Long enterpriseId) {
    String enterpriseDefault = AppContext.getProperties("clientAddCategoryId");
    List<Long> authorizeIds = new ArrayList();
    List<Long> publicacIds = new ArrayList();
    publicacIds.add(NumberUtils.toLong(enterpriseDefault));
    return addressbookCategoryDao.findByAcIdAndAcNameAndEnterpriseId(authorizeIds, publicacIds, "",
        enterpriseId);
  }

  // /**
  // * 分页查询通讯录分类
  // *
  // * @author 冯晋首
  // * @date 2015年12月7日 下午3:12:17
  // * @param info
  // * @param start
  // * @param max
  // * @return
  // */
  // public List<AddressbookCategory>
  // queryAllByConditionRole(AddressbookCategory info) {
  // Long enterpriseId = info.getEnterpriseId();
  // String isPublic = info.getIsPublic();
  // Long perAddCategoryId =
  // Long.valueOf(AppContext.getProperties("perAddCategoryId"));
  // return
  // addressbookCategoryDao.findByEnterprseIdAndIsPublicAndExcludePerAddCategory(enterpriseId,
  // isPublic,
  // perAddCategoryId);
  // }
  //
  // public List<AddressbookCategory> queryAll(AddressbookCategory info) {
  // Long enterpriseId = info.getEnterpriseId();
  // String isPublic = info.getIsPublic();
  // Long perAddCategoryId =
  // Long.valueOf(AppContext.getProperties("perAddCategoryId"));
  // return
  // addressbookCategoryDao.findAllByEnterprseIdAndIsPublicAndExcludePerAddCategory(enterpriseId,
  // isPublic,
  // perAddCategoryId);
  // }
  //
  // /**
  // * 分页查询通讯录分类数量
  // *
  // * @author 冯晋首
  // * @date 2015年12月7日 下午3:12:50
  // * @param info
  // * @return
  // */
  // public int queryCountRole(AddressbookCategory info) {
  // Long enterpriseId = info.getEnterpriseId();
  // String isPublic = info.getIsPublic();
  // Long perAddCategoryId =
  // Long.valueOf(AppContext.getProperties("perAddCategoryId"));
  // return
  // addressbookCategoryDao.findAllCountByEnterprseIdAndIsPublicAndExcludePerAddCategory(enterpriseId,
  // isPublic, perAddCategoryId);
  // }
  //
  // /**
  // * 查询通讯录授权下的所有分类
  // *
  // * @author zhangyong
  // * @date 2013-7-22 上午11:03:49
  // * @param enterpriseId
  // * @return
  // */
  // public List<AddressbookCategory> queryAllOfAddrole(Long enterpriseId) {
  // String isPublic = "1";
  // Long perAddCategoryId =
  // Long.valueOf(AppContext.getProperties("perAddCategoryId"));
  // return
  // addressbookCategoryDao.findAllByEnterprseIdAndIsPublicAndExcludePerAddCategory(enterpriseId,
  // isPublic,
  // perAddCategoryId);
  // }

  // /**
  // * 保存通信录分类信息 建立日期 : Apr 18, 2013 <br>
  // * 作者 : 王阿敏<br>
  // *
  // * @param addressbookCategory
  // */
  // @Transactional(readOnly = false)
  // public void saveOrUpdate(AddressbookCategory addressbookCategory) {
  // this.addressbookCategoryDao.saveOrUpdate((AddressbookCategory)
  // addressbookCategory);
  // }

  /**
   * 根据人员id、人员所属部门id、人员角色、是否管理员、所属租户id查询所有用户通讯录分类分组视图对象列表.
   * 
   * @param personnelId 人员id,不能为空
   * @param depId 人员所属部门id,不能为空
   * @param role 人员角色id,不能为空
   * @param ifAdmin 是否管理员,不能为空
   * @param enterpriseId 所属租户id,不能为空
   * @return 全部分类视图列表
   */
  public List<CategoryGroupView> findAllCategoryGroupViews(Long personnelId, Long depId, Long role,
      boolean ifAdmin, Long enterpriseId) {
    List<CategoryGroupView> result = new ArrayList();
    List<AddressbookCategory> cateGoryList = this.findAllByAcNameAndPersonnelProperties("",
        personnelId, depId, role, ifAdmin, enterpriseId);
    if (cateGoryList != null && cateGoryList.size() != 0) {
      for (AddressbookCategory cateGory : cateGoryList) {
        CategoryGroupView categoryGroupView = new CategoryGroupView();
        categoryGroupView.setAddressbookCategory(cateGory);
        categoryGroupView.setAcId(String.valueOf(cateGory.getAcId()));
        categoryGroupView.setAcName(cateGory.getAcName());
        List<AddressbookGroup> groupList =
            addressbookGroupService.findAllByAgnameAndEnterpriseProperties("", enterpriseId,
                cateGory.getAcId(), personnelId);
        categoryGroupView.setAddressbookGroup(groupList);
        result.add(categoryGroupView);
      }
    }
    return result;
  }

  // /**
  // * 查询通讯录分类与分类下的组信息 建立日期 : Apr 18, 2013 <br>
  // * 作者 : 王阿敏<br>
  // *
  // * @return
  // */
  // public List<AddressbookCategoryGroupView>
  // queryCategory(AddressbookCategory info, PersonnelInter p) {
  // Long pId = p.getPersonnelId();
  // List<AddressbookCategoryGroupViewInter> list = new
  // ArrayList<AddressbookCategoryGroupViewInter>();
  // List<AddressbookCategory> addressbookCategory =
  // addressbookCategoryDao.queryAll((AddressbookCategory) info);
  // // 加入权限的判断
  // if (addressbookCategory != null) {
  // for (AddressbookCategory a : addressbookCategory) {
  // boolean showStarts = false; // 是否为查看权限
  // // 加入查看权限
  // String perAddCategoryIdStr =
  // AppContext.getProperties("perAddCategoryId");// 个人通讯录Id
  // // 个人通讯录或者本人是管理员，不需要有权限zhangyong20130722
  // if (perAddCategoryIdStr.equals(a.getAcId().toString())
  // || (p.getIsAdmin() != null &&
  // p.getIsAdmin().equals(OAConstant.IS_ADMIN))) {
  // showStarts = true;
  // } else {
  // AddressbookRoleView roleView = new AddressbookRoleView();
  // roleView.setEnterpriseId(a.getEnterpriseId());
  // roleView.setObjId(pId);
  // roleView.setParentId(a.getAcId());
  // roleView.setParentType(OAConstant.ROLE_Parent_TYPE_CATEGORY);
  // List<AddressbookRole> roles = addressbookRoleDao.findByView(roleView);
  // if (roles.size() > 0) {
  // showStarts = true;
  // }
  // }
  //
  // if (showStarts == true) {
  // CategoryGroupView view = new CategoryGroupView();
  //
  // List<AddressbookGroupInter> group = addressbookGroupDao.queryByacId(pId,
  // a.getAcId(),
  // info.getEnterpriseId());
  // List<AddressbookGroupInter> groupList = new
  // ArrayList<AddressbookGroupInter>();
  // // int gc=0;
  // if (group != null) {
  // for (AddressbookGroupInter g : group) {
  // AddressbookRoleView roleView = new AddressbookRoleView();
  // roleView.setEnterpriseId(g.getEnterpriseId());
  // roleView.setObjId(pId);
  // roleView.setParentId(g.getAgId());
  // roleView.setParentType(OAConstant.ROLE_Parent_TYPE_GROUP);
  //
  // groupList.add((AddressbookGroup) g);
  // // if(g.getAcId().longValue() ==
  // // Long.parseLong(perAddCategoryIdStr)){
  // // groupList.add(g);
  // // }
  // // else{
  // // List<AddressbookRole> roles =
  // // addressbookRoleDao.findByView(roleView);
  // // if(roles.size()>0){
  // // Addressbook ainfo = new Addressbook();
  // // ainfo.setAgId(g.getAgId());
  // // gc = addressbookDao.queryCount(ainfo);
  // // view.setPTotal(gc+"");
  // // groupList.add(g);
  // // }
  // // }
  // }
  // }
  // view.setAcName(a.getAcName());
  // view.setAcId(a.getAcId());
  // view.setAddressbookGroup(groupList);
  // list.add(view);
  // }
  // }
  // }
  // return list;
  // }

}
